package models

import (
	"order_srv/basic/config"
	"time"
)

// 评价类型常量
type RatingType int

const (
	RatingTypePassengerToDriver RatingType = 1 // 乘客评价司机
	RatingTypeDriverToPassenger RatingType = 2 // 司机评价乘客
)

// 统一评价模型
// 同时支持司机评价乘客和乘客评价司机
// 通过type字段区分评价方向

type Rating struct {
	Id          int32     `gorm:"column:id;type:int;primaryKey;not null;" json:"id"`
	OrderId     uint32    `gorm:"column:order_id;type:int UNSIGNED;comment:订单id;not null;" json:"order_id"`                           // 订单id
	RaterId     uint32    `gorm:"column:rater_id;type:int UNSIGNED;comment:评价者id;not null;" json:"rater_id"`                           // 评价者id
	TargetId    uint32    `gorm:"column:target_id;type:int UNSIGNED;comment:被评价者id;not null;" json:"target_id"`                         // 被评价者id
	RatingType  int       `gorm:"column:rating_type;type:tinyint;comment:评价类型 1-乘客评价司机 2-司机评价乘客;not null;" json:"rating_type"`   // 评价类型
	Score       uint8     `gorm:"column:score;type:tinyint UNSIGNED;comment:评分 1-极度不满意 2-不满意 3-一般 4-满意 5-非常棒;not null;" json:"score"` // 评分
	Comment     string    `gorm:"column:comment;type:varchar(500);comment:评论内容;not null;" json:"comment"`                               // 评论内容
	Tags        string    `gorm:"column:tags;type:varchar(255);comment:评价标签，逗号分隔;default:'';" json:"tags"`                         // 评价标签，逗号分隔
	Images      string    `gorm:"column:images;type:text;comment:评价图片URL，逗号分隔;default:'';" json:"images"`                        // 评价图片URL，逗号分隔
	CreateAt    time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;" json:"create_at"`
	UpdateAt    time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;" json:"update_at"`
	DeleteAt    time.Time `gorm:"column:delete_at;type:datetime;default:NULL;" json:"delete_at"`
}

func (r *Rating) TableName() string {
	return "rating"
}

// 创建评价
func (r *Rating) CreateRating() error {
	return config.DB.Create(&r).Error
}

// 获取指定订单和指定评价者的评价
func (r *Rating) GetRatingByOrderAndRater(orderId, raterId uint32, ratingType RatingType) error {
	return config.DB.Where("order_id = ? AND rater_id = ? AND rating_type = ?", orderId, raterId, ratingType).First(r).Error
}

// 获取用户收到的所有评价（作为被评价者）
func GetRatingsByTargetId(targetId uint32, ratingType RatingType) ([]*Rating, error) {
	var ratings []*Rating
	err := config.DB.Where("target_id = ? AND rating_type = ?", targetId, ratingType).Find(&ratings).Error
	return ratings, err
}

// 获取用户发出的所有评价（作为评价者）
func GetRatingsByRaterId(raterId uint32, ratingType RatingType) ([]*Rating, error) {
	var ratings []*Rating
	err := config.DB.Where("rater_id = ? AND rating_type = ?", raterId, ratingType).Find(&ratings).Error
	return ratings, err
}

// 获取用户平均评分
func GetAverageRating(targetId uint32, ratingType RatingType) (float64, error) {
	var avgRating float64
	err := config.DB.Model(&Rating{}).Where("target_id = ? AND rating_type = ?", targetId, ratingType).Select("AVG(score)").Scan(&avgRating).Error
	return avgRating, err
}
